草庐IT

javascript oop、instanceof 和基类

全部标签

C++:有什么方法可以防止抽象基类的任何实例化?

除了拥有一个纯虚函数之外,有没有办法防止抽象基类的实例化?我可以这样做:classBaseFoo{virtualvoidblah()=0;};classFoo:publicBaseFoo{virtualvoidblah(){}};但我想避免使用vtable。(根据myotherquestionaboutvirtualdestructors)MicrosoftATL有ATL_NO_VTABLE来完成这个(或者至少我认为它是这样做的......) 最佳答案 一个非常明显的方法是声明一个protected构造函数,并在非抽象派生类中声明公

c++ - 基类的前向声明

我正在尝试创建适当的头文件,其中不包含太多其他文件以保持它们干净并加快编译时间。我在执行此操作时遇到了两个问题:基类的前向声明不起作用。classB;classA:publicB{//...}STD类的前向声明不起作用。namespacestd{classstring;}classA{stringaStringToTest;}我该如何解决这些问题? 最佳答案 第一个你不能解决的问题。第二个问题与标准库类无关。这是因为您将类的一个实例声明为您自己的类的成员。这两个问题都是由于要求编译器必须能够从其定义中找出类的总大小。但是,编译器可以

c++ - 基类的前向声明

我正在尝试创建适当的头文件,其中不包含太多其他文件以保持它们干净并加快编译时间。我在执行此操作时遇到了两个问题:基类的前向声明不起作用。classB;classA:publicB{//...}STD类的前向声明不起作用。namespacestd{classstring;}classA{stringaStringToTest;}我该如何解决这些问题? 最佳答案 第一个你不能解决的问题。第二个问题与标准库类无关。这是因为您将类的一个实例声明为您自己的类的成员。这两个问题都是由于要求编译器必须能够从其定义中找出类的总大小。但是,编译器可以

c++ - 为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau、g++(ideone)和EDG接受以下代码而不进行诊断。VisualC++编译成功,但出现警告C4624。classindestructible_base{~indestructible_base();};classT:indestructible_base{public://T(){}};intmain(void){newT();}取消注释构造函数,它不再编译。也许是这样的规则,如果构造函数内部发生异常,必须销毁子对象?看起来很奇怪,因为主体是空的并且不会导致异常。即便如此,添加一个异常规范来保证不会抛出异常(throw()或noexcept),这没有任何区别。为什么用

c++ - 为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau、g++(ideone)和EDG接受以下代码而不进行诊断。VisualC++编译成功,但出现警告C4624。classindestructible_base{~indestructible_base();};classT:indestructible_base{public://T(){}};intmain(void){newT();}取消注释构造函数,它不再编译。也许是这样的规则,如果构造函数内部发生异常,必须销毁子对象?看起来很奇怪,因为主体是空的并且不会导致异常。即便如此,添加一个异常规范来保证不会抛出异常(throw()或noexcept),这没有任何区别。为什么用

c++ - 从 std::enable_shared_from_this 和抽象基类派生可以吗?

我正在编写一个应该从抽象基类派生的类。我无法更改抽象基类。该类(class)将以shared_ptr的形式举行到抽象基类。继承抽象基类和可以吗enable_shared_from_this?像这样:classIWidget{public:virtual~IWidget(){}//...};classWidget:publicstd::enable_shared_from_this,publicIWidget{protected:Widget();//protected,usecreatepublic:staticstd::shared_ptrcreate(){returnstd::sh

c++ - 从 std::enable_shared_from_this 和抽象基类派生可以吗?

我正在编写一个应该从抽象基类派生的类。我无法更改抽象基类。该类(class)将以shared_ptr的形式举行到抽象基类。继承抽象基类和可以吗enable_shared_from_this?像这样:classIWidget{public:virtual~IWidget(){}//...};classWidget:publicstd::enable_shared_from_this,publicIWidget{protected:Widget();//protected,usecreatepublic:staticstd::shared_ptrcreate(){returnstd::sh

c++ - 复制省略直接基类初始化?

这个问题在这里已经有了答案:Whyisn'tRVOappliedtobaseclasssubobjectinitialization?(2个回答)关闭3年前。以下代码无法同时使用Gcc和Clang编译,因为B基类子对象在A构造函数中的复制构造:structB{B();B(constB&)=delete;};structA:B{A():B(B()){}//=>error:useofdeletedfunction...};不过根据[class.base.init]/7:Theexpression-listorbraced-init-listinamem-initializerisusedt

c++ - 复制省略直接基类初始化?

这个问题在这里已经有了答案:Whyisn'tRVOappliedtobaseclasssubobjectinitialization?(2个回答)关闭3年前。以下代码无法同时使用Gcc和Clang编译,因为B基类子对象在A构造函数中的复制构造:structB{B();B(constB&)=delete;};structA:B{A():B(B()){}//=>error:useofdeletedfunction...};不过根据[class.base.init]/7:Theexpression-listorbraced-init-listinamem-initializerisusedt

c++ - 强制调用基类虚函数

我有一些这样的事件classGranpa//thiswouldnotbechanged,asitsinadllandnotwrittenbyme{public:virtualvoidonLoad(){}}classFather:publicGranpa//mymodificationonGranpa{public:virtualvoidonLoad(){//doimportantstuff}}classChild:publicFather//clientwillderiveFather{virtualvoidonLoad(){//Father::onLoad();//i'mtrying